package com.example.Service.Impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.Entity.Resources;
import com.example.Mappers.ResourcesMapper;
import com.example.Service.ResourcesService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@Service
public class ResourcesServiceImpl extends ServiceImpl<ResourcesMapper, Resources> implements ResourcesService {


    @Autowired
    ResourcesMapper resourcesMapper;
    //全局变量，用来存放图片地址
    List<String> lists = new ArrayList<>();
    //服务器图片路径
    List<String> imgUrls = new ArrayList<>();
    //全局变量，用来存放图片地址
    List<String> docLists = new ArrayList<>();
    //服务器图片路径
    List<String> docxUrls = new ArrayList<>();

    /**
     * 单文件保存功能
     */
    public boolean InputUrl(MultipartFile file, String account) {
        //存放服务器的路径 url()方法为返回隐射文件夹
        String filepath = url() + account + "/" + file.getOriginalFilename();
        //数据库存储的路径，去掉前缀 存放在数据库做后续查询
        String newFilePath = account + "/" + file.getOriginalFilename();

        File f = new File(filepath);
        //文件夹是否存在
        if (f.exists()) {
            try {
                //文件夹存在则直接将文件放在服务器 无需再进行文件路径传送
                file.transferTo(f);
                return true;
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            //创建该文件夹
            try {
                //文件夹不存在则创建该路径,mkdirs()方法创建指定路径
                if (f.mkdirs()) {
                    //文件存放后想数据库中插入一条该文件所代表的路径
                    file.transferTo(f);
                    resourcesMapper.insertUrl(account, newFilePath);
                    return true;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return false;
    }

    /**
     * 多文件保存功能
     */
    public boolean InputUrl(MultipartFile[] file, String account) {
        String filePath = account + "/" + file[0].getOriginalFilename();
        //斜杠拆分
        String newFilePath = filePath.substring(0, filePath.lastIndexOf("/"));
        try {
            resourcesMapper.insertUrl(account, newFilePath);
        } catch (Exception e) {
            e.printStackTrace();
        }
        for (MultipartFile fi : file) {
            //存放服务器的路径 url()方法为返回隐射文件夹
            String filepath = url() + account + "/" + fi.getOriginalFilename();
            File f = new File(filepath);
            //文件夹是否存在
            if (f.exists()) {
                try {
                    //文件夹存在则直接将文件放在服务器 无需再进行文件路径传送
                    fi.transferTo(f);
                } catch (IOException e) {
                    e.printStackTrace();
                    return false;
                }
            } else {
                //创建该文件夹
                try {
                    //文件夹不存在则创建该路径,mkdirs()方法创建指定路径
                    if (f.mkdirs()) {
                        //文件存放后想数据库中插入一条该文件所代表的路径
                        fi.transferTo(f);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                    return false;
                }
            }
        }
        return true;
    }


    /**
     * @param account 账号
     * @return 解析了一下的地址
     * 通过账号查询当前的资源目录
     */
    @Override
    public List<String> getUrl(String account) {
//        return "/resource/" + resourcesMapper.getUrl(account);
        return resourcesMapper.getUrl(account);
    }

    /**
     * 数据库操作映射文件路径，方便后期修改
     *
     * @return 映射文件路径
     */
    public String url() {
        return resourcesMapper.testurl();
    }

    /**
     * @param fileName 文件名
     * @param userName 微信名
     * @return C:\Users\tuiche\Desktop\Kay\Kaybean Lau\17715529892@chatroom_files\46.jpg  图片地址集合
     */
    @Override
    public List<String> getImg(String account, String fileName, String userName) {
        //固定格式：服务器地址加文件名加微信用户名
        //http://47.107.87.99:8080/resource/zhhhh/Archive/index.html
        String accountPath = url() + account + "/" + fileName + "/" + userName;
        //写入该路径
        File fi = new File(accountPath);
        List<String> paths = new ArrayList<String>();
        //存的一级文件的地址
        func(fi, paths);
        for (String pa : paths) {
            //二级文件
            func(new File(pa));
        }
        //lists:存储好的全局变量
        //对拿到的字符串进行进一步的解析处理，返回给前端
        for (String list : lists) {
            String imgUrl = "/resource/" + list.split("/root/jdk/test/")[1];
            imgUrls.add(imgUrl);
        }
        //解析好的服务器图片链接，/resource/zhhhh/Archive/index.html格式
        return imgUrls;
    }

    @Override
    public List<String> getDocx(String account, String fileName, String userName) {
        String accountPath = url() + account + "/" + fileName + "/" + userName;
        //写入该路径
        File fi = new File(accountPath);
        List<String> paths = new ArrayList<String>();
        //存的一级文件的地址
        func(fi, paths);
        for (String pa : paths) {
            //二级文件
            func(new File(pa));
        }
        //lists:存储好的全局变量
        //对拿到的字符串进行进一步的解析处理，返回给前端
            for (String docList : docLists) {
                String docUrl = "/resource/" + docList.split("/root/jdk/test/")[1];

                docxUrls.add(docUrl);
            }
            //解析好的服务器图片链接，/resource/zhhhh/Archive/index.html格式
            return docxUrls;
    }


    //查找所有联系人的个人聊天记录的文件夹名
    private void func(File file,List<String> paths){
        File[] fs = file.listFiles();
        //文件数组不为空
        if (fs != null) {
            for(File f:fs){
                //文件是文件夹
                if(f.isDirectory()){
                    //文件夹的路径放在集合中
                    paths.add(f.getPath());
                }
            }
        }
    }
    //将所有个人文件夹当中汇总的图片和
    private void func(File file){
        File[] fs = file.listFiles();
        if (fs != null) {
            for(File f:fs){
                //筛选
                if(f.isFile()&&!(f.getName().contains(".DS_Store"))&&f.getName().contains(".jpg")){
//                    System.out.println(f.getPath());
                    //将得到的图片地址存放到集合中
                    lists.add(f.getPath());
                }else if (f.isFile()&&!(f.getName().contains(".DS_Store"))&&f.getName().contains(".docx")){
                    docLists.add(f.getPath());
                }
            }
        }
    }
}
